﻿using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using Box.Entities;
namespace Box.Repository
{
    public class VentaRepository : MasterRepository, IVentaRepository
    {
        public List<Venta> GetAllFromVenta()
        {
            var query = from c in Context.Ventas
                        .Include("Cliente")
                        //.Include("DetalleVenta.Producto")
                        select c;
            return query.ToList();
        }

        public List<Venta> GetFromVentaByCriterio(string criterio)
        {
            var query = from c in Context.Ventas
                        .Include("Cliente")
                        //.Include("DetalleVenta.Producto")
                        select c;
            if (criterio != null && criterio != string.Empty)
            {
                query = query.Where(p => p.Cliente.NombreCliente.ToUpper().Contains(criterio.ToUpper())
                                         || p.Cliente.RucCliente.Equals(criterio.ToUpper()));
            }
            return query.ToList();
        }

        public Venta GetFromVentaById(int id)
        {
            var query = from p in Context.Ventas
                        .Include("Cliente")
                        where p.Id.Equals(id)
                        select p;
            return query.SingleOrDefault();
        }

        public void AddVenta(Venta venta)
        {
            var newVenta = new Venta();
            newVenta.ClienteId = venta.ClienteId;
            //newVenta.Cliente = venta.Cliente;
            newVenta.Fecha = venta.Fecha;
            newVenta.Total = venta.Total;

            foreach (var item in venta.DetalleVenta)
            {
                var detalle = new DetalleVenta();
                detalle.Cantidad = item.Cantidad;
                detalle.IdProducto = item.IdProducto;

                detalle.PrecioUnit = item.PrecioUnit;

                newVenta.DetalleVenta.Add(detalle);
            }

            Context.Ventas.Add(newVenta);
            Context.SaveChanges();
            
           
        }

        public void UpdateVenta(Venta venta)
        {
            var ventaDB = GetFromVentaById(venta.Id);

            ventaDB.Fecha = venta.Fecha;
            ventaDB.Total = venta.Total;
            

            if (ventaDB.ClienteId != venta.ClienteId)
            {
                ventaDB.ClienteId = venta.ClienteId;
                ventaDB.Cliente = venta.Cliente;
                Context.Entry(ventaDB.Cliente).State = EntityState.Unchanged;
            }



            var DetallesEliminados = new List<DetalleVenta>();

            foreach (var detalleBD in ventaDB.DetalleVenta)
            {
                var eliminado = venta.DetalleVenta.Where(dp => dp.Item == detalleBD.Item).SingleOrDefault();

                if (eliminado == null)
                {
                    DetallesEliminados.Add(detalleBD);
                }
            }

            foreach (var detEliminado in DetallesEliminados)
            {
                var eliminar = ventaDB.DetalleVenta.Where(dp => dp.Item == detEliminado.Item).SingleOrDefault();

                ventaDB.DetalleVenta.Remove(eliminar);

            }


            foreach (var detalle in venta.DetalleVenta)
            {
                //nuevos detalles
                if (detalle.Item == 0)
                {
                    Context.Entry(detalle.Producto).State = EntityState.Unchanged;
                    ventaDB.DetalleVenta.Add(detalle);
                }
                else//modificados
                {
                    var detalleDB = ventaDB.DetalleVenta.Where(dp => dp.Item == detalle.Item).SingleOrDefault();

                    detalleDB.Cantidad = detalle.Cantidad;
                    detalleDB.PrecioUnit = detalle.PrecioUnit;

                    Context.Entry(detalleDB.Producto).State = EntityState.Unchanged;
                    Context.Entry(detalleDB).State = EntityState.Modified;

                }
            }

            Context.Entry(ventaDB).State = EntityState.Modified;

            Context.SaveChanges();
        }

        public void RemoveVenta(int id)
        {
            var existe = Context.Ventas.Find(id);
            if (existe != null)
            {
                Context.Ventas.Remove(existe);
                Context.SaveChanges();
            }
        }

        public bool ExisteVenta(int id)
        {
            var query = Context.Ventas.Where(p => p.Id.Equals(id));

            return query.Any();
        }

        public List<Decimal> ListVent(int anio)
        {
            var query = Context.Database.SqlQuery<Decimal>("exec dbo.spRepVenta @fecha='" + anio + "'");
            return query.ToList();
        }

        public List<Venta> GetFromVentasByRangoFechas(DateTime fechaI, DateTime fechaF)
        {

            var query = from p in Context.Ventas
                where p.Fecha >= fechaI && p.Fecha <= fechaF
                select p;
                return query.ToList();       
        }
        public List<Venta> GetFromVentasByAnio(int anio)
        {

            //var query = from p in Context.Ventas
            //            select p;
            //if (anio != null)
            //{
            //    query = (from p in query
            //             where p.Fecha.Year.Equals(anio)
            //             orderby p.Fecha.Month ascending
            //             select p);

            //}
            //return query.ToList();
            var prueba = ListVent(anio);
                var query = Context.Database.SqlQuery<Venta>("exec dbo.spRepVenta @fecha='" + anio + "'");
                return query.ToList();

        }
    }
}
